// Copyright 2023 Huawei Cloud Computing Technology Co., Ltd.
//
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
// You may obtain a copy of the License at
//
//     http://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS,
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
// See the License for the specific language governing permissions and
// limitations under the License.

#ifndef CLOUDAPPENGINE_CAEIMECLIENT_H
#define CLOUDAPPENGINE_CAEIMECLIENT_H

#include <mutex>
#include <thread>

const int IME_MSG_HEADER_LEN = 3;
const int IME_HANDSHAKE_PKT = 4;
const int IME_HANDSHAKE_ACK_PKT = 5;

typedef struct CaeImeMsgHeader {
    uint8_t type;
    uint16_t length;
}CaeImePktHeader_t;

typedef struct CaeImeMsgBody {
    uint8_t *data;
    uint32_t len;
}CaeImePktBody_t;

class CaeImeClient {
public:
    CaeImeClient();
    ~CaeImeClient();
    int StartProcess();
    int StopProcess();
    bool GetConnectState();
    bool Handshake();
    friend void ImeMsgHandler(void *para);
    friend void InputMsgHandler(void *para, bool *isTaskRun);

private:
    CaeImeClient(CaeImeClient &);

    int WriteN(uint8_t *data, const int length);
    int ReadN(uint8_t *buf, int length);
    int Connect();

    std::mutex mImeMutex;
    int mSockFd;
    bool mIsTaskRun;
    std::thread mImeThread;
    bool mConnectState;
};

#endif //CLOUDAPPENGINE_CAEIMECLIENT_H